package com.xoa.service.book;

import com.xoa.dao.book.BookInfoMapper;
import com.xoa.dao.book.BookManageMapper;
import com.xoa.dao.book.BookManagerMapper;
import com.xoa.dao.users.UsersMapper;
import com.xoa.model.book.BookInfoWithBLOBs;
import com.xoa.model.book.BookManage;
import com.xoa.model.book.BookManager;
import com.xoa.model.users.Users;
import com.xoa.util.CookiesUtil;
import com.xoa.util.DateFormat;
import com.xoa.util.ToJson;
import com.xoa.util.common.L;
import com.xoa.util.common.StringUtils;
import com.xoa.util.common.session.SessionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 创建作者:   牛江丽
 * 创建日期:   2017-10-24
 * 类介绍  : 图书管理中：借书、还书
 * 构造参数:
 */
@Service
public class BookManageService {

    @Resource
    private BookManageMapper bookManageMapper;

    @Resource
    private UsersMapper usersMapper;

    @Resource
    private BookManagerMapper bookManagerMapper;

    @Resource
    private BookInfoMapper bookInfoMapper;

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月24日 下午15:30:00
     * 方法介绍:   借书登记
     * 参数说明:   @param bookManage
     * 返回值说明:
     */
    @Transactional
    public ToJson<BookManage> insertManage(BookManage bookManage, HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            Cookie redisSessionId = CookiesUtil.getCookieByName(request, "redisSessionId");
            Users user= SessionUtils.getSessionInfo(request.getSession(), Users.class, new Users(),redisSessionId);
            BookInfoWithBLOBs bookInfo=bookInfoMapper.selInfoByBookNo(bookManage.getBookNo());
            if(bookInfo!=null){
                if (bookInfo.getAmt()<=0){//数量不足，不能借阅
                    json.setMsg("notEnoughNum");
                    return json;
                }
                if(!StringUtils.checkNull(bookInfo.getOpen())){
                    String[] openArr=bookInfo.getOpen().split(";");
                    if(openArr.length==1){
                        bookInfo.setOpenDept(openArr[0].toString());
                   }else if(openArr.length==2){
                        bookInfo.setOpenDept(openArr[0].toString());
                        bookInfo.setOpenUser(openArr[1].toString());
                   }else if(openArr.length==3){
                        bookInfo.setOpenDept(openArr[0].toString());
                        bookInfo.setOpenUser(openArr[1].toString());
                        bookInfo.setOpenUserPriv(openArr[2].toString());
                   }
                    bookInfo.setCurrentUser(user.getUserId());
                    if(bookInfoMapper.selInfoByUser(bookInfo)==null){
                        json.setMsg("notEnoughPriv");
                        return json;
                    }
                }
            }
            if(!StringUtils.checkNull(bookManage.getBuserId()) && bookManage.getBuserId().contains(",")){
                bookManage.getBuserId().substring(0,bookManage.getBuserId().length()-1);
            }
            if(bookManage.getBorrowDate()!=null){
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
                bookManage.setBorrowDate(sdf.parse(sdf.format(new Date())));
            }
            if(bookManage.getReturnDate()!=null){
                Calendar c = Calendar.getInstance();
                c.setTime(bookManage.getBorrowDate());
                c.add(Calendar.DATE, 30);//计算30天后的时间
                bookManage.setReturnDate(c.getTime());
            }
            if(bookManage.getRegFlag().equals("1")){//直接登记
                bookManage.setRuserId(user.getUserId());//审批人：已准借书
                bookManage.setStatus("0");
                bookManage.setBookStatus("1");
            }else{//待批借书
                bookManage.setStatus("1");
                bookManage.setBookStatus("0");
            }
            bookManage.setDeleteFlag("0");
            bookManage.setRenewFlag("0");
            int count=bookManageMapper.insertManage(bookManage);//进行借阅
            //修改图书数量,减一
            BookInfoWithBLOBs book=new BookInfoWithBLOBs();
            book.setBookId(bookInfo.getBookId());
            book.setAmt(bookInfo.getAmt()-1);
            bookInfoMapper.upBookInfoById(book);
            if(count>0){
                json.setMsg("ok");
                json.setFlag(0);
            }
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService insertManage:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月24日 下午15:31:00
     * 方法介绍:   修改借书信息
     * 参数说明:   @param bookManage
     * 借书： bookStatus=1
     * 还书：status=1
     * 返回值说明:
     */
    @Transactional
    public ToJson<BookManage> upManageById(BookManage bookManage,HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            Cookie redisSessionId = CookiesUtil.getCookieByName(request, "redisSessionId");
            Users user= SessionUtils.getSessionInfo(request.getSession(), Users.class, new Users(),redisSessionId);
            //对页面中的数据进行处理
            if(!StringUtils.checkNull(bookManage.getDeleteFlag()) && bookManage.getDeleteFlag().equals("3")){
                bookManage.setDeleteFlag(null);
            }
            if(!StringUtils.checkNull(bookManage.getBookStatus()) && bookManage.getBookStatus().equals("3")){
                bookManage.setBookStatus(null);
            }
            if(!StringUtils.checkNull(bookManage.getStatus()) && bookManage.getStatus().equals("3")){
                bookManage.setStatus(null);
            }
            if(!StringUtils.checkNull(bookManage.getRenewFlag()) && bookManage.getRenewFlag().equals("3")){
                bookManage.setRenewFlag("0");
            }

            if(!StringUtils.checkNull(bookManage.getBookStatus()) && bookManage.getBookStatus().equals("1")) {//审批，可以借书：已准借书
                bookManage.setRuserId(user.getUserId());
                bookManage.setStatus("0");
            }else if(!StringUtils.checkNull(bookManage.getStatus()) && bookManage.getStatus().equals("1")){ //审批，可以还书：已准还书
                bookManage.setBookStatus("1");
                bookManage.setRealReturnTime(new Date());
                //先查出图书编号
                BookManage manage=bookManageMapper.selManageById(bookManage.getBorrowId());
                if(manage!=null){
                    BookInfoWithBLOBs book=bookInfoMapper.selInfoByBookNo(manage.getBookNo());
                    //修改图书数量
                    book.setAmt(book.getAmt()+1);
                    bookInfoMapper.upBookInfoById(book);
                }
            }else if(!StringUtils.checkNull(bookManage.getStatus()) && bookManage.getStatus().equals("0")){ //还书申请：待批还书
                bookManage.setBookStatus("0");
            }else if(!StringUtils.checkNull(bookManage.getRenewFlag()) && bookManage.getRenewFlag().equals("1")){//续借
                BookManage temp=bookManageMapper.selManageById(bookManage.getBorrowId());
                if(temp!=null){
                    if(temp.getReturnDate()!=null){
                        Calendar c = Calendar.getInstance();
                        c.setTime(temp.getReturnDate());
                        c.add(Calendar.DATE, 30);//计算30天后的时间
                        bookManage.setReturnDate(c.getTime());
                    }
                }
            }else if(!StringUtils.checkNull(bookManage.getBookStatus()) && !StringUtils.checkNull(bookManage.getDeleteFlag())){//待批删除时，要将数量进行恢复
                if(bookManage.getBookStatus().equals("0") && bookManage.getDeleteFlag().equals("1")){
                    //先查出图书编号
                    BookManage manage=bookManageMapper.selManageById(bookManage.getBorrowId());
                    if(manage!=null){
                        BookInfoWithBLOBs book=bookInfoMapper.selInfoByBookNo(manage.getBookNo());
                        //修改图书数量
                        book.setAmt(book.getAmt()+1);
                        bookInfoMapper.upBookInfoById(book);
                    }
                }
            }else if(!StringUtils.checkNull(bookManage.getBookStatus()) && bookManage.getBookStatus().equals("2")){//未准借书时，需要将图书数量恢复
                //先查出图书编号
                BookManage manage=bookManageMapper.selManageById(bookManage.getBorrowId());
                if(manage!=null){
                    BookInfoWithBLOBs book=bookInfoMapper.selInfoByBookNo(manage.getBookNo());
                    //修改图书数量
                    book.setAmt(book.getAmt()+1);
                    bookInfoMapper.upBookInfoById(book);
                }
            }
            int count=bookManageMapper.upManageById(bookManage);
            if(count>0){
                json.setMsg("ok");
                json.setFlag(0);
            }
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService upManageById:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月24日 下午15:32:00
     * 方法介绍:   根据id删除借书信息
     * 参数说明:   @param borrowId
     * 返回值说明:
     */
    @Transactional
    public ToJson<BookManage> delManageById(Integer borrowId){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            int count=bookManageMapper.delManageById(borrowId);
            if(count>0){
                json.setMsg("ok");
                json.setFlag(0);
            }
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService delManageById:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月24日 下午15:33:00
     * 方法介绍:   根据id查询借书信息
     * 参数说明:   @param borrowId
     * 返回值说明:
     */
    public ToJson<BookManage> selManageById(Integer borrowId){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            BookManage bookManage=bookManageMapper.selManageById(borrowId);
            json.setObject(bookManage);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selManageById:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月24日 下午15:34:00
     * 方法介绍:   待批借阅-0、已准借阅-1、未准借阅-2 bookStatus
     * 参数说明:   @param bookManage
     * 返回值说明:
     */
    public ToJson<BookManage> selManageByBookStatus(BookManage bookManage,HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            Cookie redisSessionId = CookiesUtil.getCookieByName(request, "redisSessionId");
            Users user= SessionUtils.getSessionInfo(request.getSession(), Users.class, new Users(),redisSessionId);
            bookManage.setBuserId(user.getUserId());
            List<BookManage> list=bookManageMapper.selManageByBookStatus(bookManage);
            for(BookManage bookManage1:list){
                if(bookManage1.getRegFlag().equals("0")){
                    bookManage1.setRuserName(bookManage1.getRuserName());
                }
            }
            json.setObj(list);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selManageByBookStatus:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月25日 上午9:55:00
     * 方法介绍:   查询借书管理列表（直接登记，不需要审批）
     * 返回值说明:
     */
    public ToJson<BookManage> selByRegFlag(HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            List<BookManage> list=bookManageMapper.selByRegFlag();
            List<BookManage> resultList=manageByStatus(list,request);
            json.setObj(list);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selByRegFlag:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月25日 上午9:55:00
     * 方法介绍:   查询借书确认列表（不直接登记，待审批状态，当前登录人是审批人）
     * 返回值说明:
     */
    public ToJson<BookManage> selByRegFlagAndBookStatus(HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            List<BookManage> list=bookManageMapper.selByRegFlagAndBookStatus();
            List<BookManage> resultList=manageByStatus(list,request);
            json.setObj(resultList);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selByRegFlagAndBookStatus:"+e);
            e.printStackTrace();
        }
        return  json;
    }


    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月26日 上午9:55:00
     * 方法介绍:   还书确认列表（不区分登记类型）都需要进行审批
     * 返回值说明:
     */
    public ToJson<BookManage> selByStatusQuire(HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            List<BookManage> list=bookManageMapper.selByStatusQuire();
            List<BookManage> resultList=manageByStatus(list,request);
            json.setObj(resultList);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selByStatus:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月26日 上午9:55:00
     * 方法介绍:   还书管理列表（不区分登记类型），管理员帮助还书
     * 返回值说明:
     */
    public ToJson<BookManage> selByStatusManage(HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            List<BookManage> list=bookManageMapper.selByStatusManage();
            List<BookManage> resultList=manageByStatus(list,request);
            json.setObj(resultList);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selByStatusManage:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 创建作者:   牛江丽
     * 创建日期:   2017年10月26日 上午9:55:00
     * 方法介绍:   历史记录查询列表(deleteFlag=1的记录)
     * 返回值说明:
     */
    public ToJson<BookManage> selDelFlag(HttpServletRequest request){
        ToJson<BookManage> json = new ToJson<BookManage>(1, "error");
        try{
            List<BookManage> list=bookManageMapper.selDelFlag();
            List<BookManage> resultList=manageByStatus(list,request);
            json.setObj(resultList);
            json.setMsg("ok");
            json.setFlag(0);
        }catch(Exception e){
            json.setMsg(e.getMessage());
            L.e("BookManageService selDelFlag:"+e);
            e.printStackTrace();
        }
        return  json;
    }

    /**
     * 用于判断当前登录是否是管理员，进行其权限控制
     * @param list
     * @param request
     * @return
     */
    List<BookManage> manageByStatus (List<BookManage> list,HttpServletRequest request){
        Cookie redisSessionId = CookiesUtil.getCookieByName(request, "redisSessionId");
        Users user= SessionUtils.getSessionInfo(request.getSession(), Users.class, new Users(),redisSessionId);
        List<BookManage> resultList=new ArrayList<>();
        List<BookManager> managerList=bookManagerMapper.selManagerByManager(user.getUserId());
        int flag=0;
        if(managerList.size()>0){
            for(BookManage bookManage:list){
                List<BookManager> deptList=bookManagerMapper.selManagerByDept(bookManage.getDept());
                if(deptList.size()>0){
                    for(BookManager manager1:managerList){
                        for(BookManager manager2:deptList){
                            if(manager1.getAutoId()==manager2.getAutoId()){
                                flag=1;
                                break;
                            }
                        }
                        if(flag==1){
                            break;
                        }
                    }
                    if(flag==1){
                        resultList.add(bookManage);
                    }
                }
            }
        }
        for(BookManage bookManage1:resultList){
            if(bookManage1.getRegFlag().equals("0")){
                bookManage1.setRuserName(bookManage1.getRuserName());
            }
        }
        return resultList;
    }
}
